/*
 * Copyright (c) 2019. Jiangsu Sesan Technology Co., Ltd All rights reserved.
 */

package utils.encrypt;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

import javax.crypto.*;
import javax.crypto.spec.DESKeySpec;
import java.security.SecureRandom;

/**
 * 对称加密解密
 **/
public class DesUtils {
	/**
	 * 默认key
	 */
	public final static String KEY = "cNseaNce@2oi9kEy";

	/**
	 * DES加密
	 *
	 * @param data 待加密字符串
	 * @param key  校验位
	 * @return
	 */
	public static String encrypt(String data, String key) {
		String encryptedData = null;
		try {
			// DES算法要求有一个可信任的随机数源
			SecureRandom sr = new SecureRandom();
			DESKeySpec deskey = new DESKeySpec(key.getBytes());
			// 创建一个密匙工厂，然后用它把DESKeySpec转换成一个SecretKey对象
			SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
			SecretKey secretKey = keyFactory.generateSecret(deskey);
			// 加密对象
			Cipher cipher = Cipher.getInstance("DES");
			cipher.init(Cipher.ENCRYPT_MODE, secretKey, sr);
			// 加密，并把字节数组编码成字符串
			encryptedData = new BASE64Encoder().encode(cipher.doFinal(data.getBytes()));
		} catch (Exception e) {
			throw new RuntimeException("加密错误，错误信息：", e);
		}
		return encryptedData;
	}

	/**
	 * DES解密
	 *
	 * @param cryptData 待解密密文
	 * @param key       校验位
	 * @return
	 */
	public static String decrypt(String cryptData, String key) {
		String decryptedData = null;
		try {
			// DES算法要求有一个可信任的随机数源
			SecureRandom sr = new SecureRandom();
			DESKeySpec deskey = new DESKeySpec(key.getBytes());
			// 创建一个密匙工厂，然后用它把DESKeySpec转换成一个SecretKey对象
			SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
			SecretKey secretKey = keyFactory.generateSecret(deskey);
			// 解密对象
			Cipher cipher = Cipher.getInstance("DES");
			cipher.init(Cipher.DECRYPT_MODE, secretKey, sr);
			// 把字符串解码为字节数组，并解密
			decryptedData = new String(cipher.doFinal(new BASE64Decoder().decodeBuffer(cryptData)));
		} catch (Exception e) {
			throw new RuntimeException("解密错误，错误信息：", e);
		}
		return decryptedData;
	}


	public static void main(String[] args) {
		System.out.println("url::" + encrypt("江苏世轩科技http://www.cnsesan.com", KEY));
		System.out.println("username::" + encrypt("admin", KEY));
		System.out.println("password::" + encrypt("admin", KEY));
	}

}
